package com.zoe.config;

import com.zoe.bean.Car;
import com.zoe.bean.Cat;
import com.zoe.bean.Dog;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * @Author Zoe
 * @Date: 2020/11/17
 * @Description bean的生命周期:
 * bean创建 - 初始化 - 销毁过程
 * 自定义初始化销毁的方法
 * 1:
 */
@ComponentScan(value = {"com.zoe.bean"})
@Configuration
public class MainConfigBeanLife {

    /**
     * 单例
     * 容器会帮你加载,管理对象,容器加载的时候创建对象,自动调用init,destroy
     * 多例
     * 容器会帮你加载,但不会帮你管理对象,自己手动调用init,destroy
     * <p>
     * 容器初始化,destroy
     * 1: bean注解调用initMethod，destroyMethod
     * 2: bean实例 手动实现InitializingBean,DisposableBean
     * 3: bean实例使用@PostConstruct,@PreDestroy注解
     * 4: 使用BeanPostProcessor接口
     * 1):postProcessBeforeInitialization初始化之前调用的方法
     * 2):postProcessAfterInitialization初始化之后调用的方法
     *
     * @return
     */
    @Scope("prototype") //
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public Car car() {
        return new Car();
    }


    @Bean(initMethod = "init",destroyMethod = "myDestroy")
    public Cat cat() {
        return new Cat();
    }

    @Bean()
    public Dog dog() {
        return new Dog();
    }

}
